package diploma.substitucija;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class Substitucija
{
	
	public static final char[] tabela =
	{
		'A','B','C','D','E','F','G','H','I','J',
		'K','L','M','N','O','P','Q','R','S','T',
		'U','V','W','X','Y','Z',
		'Č','Š','Ž', ' '
	};
	
	public char[] tabSub;
	
	public void genSubstitucijo()
	{
		tabSub = new char[tabela.length];
		List<Character> lstTab = new LinkedList<Character>();
		for(char c : tabela)
		{
			lstTab.add(c);
		}
		int mesto = 0;
		while(lstTab.size() > 0)
		{
			int index = (int)Math.floor(lstTab.size()*Math.random()); 
			tabSub[mesto] = lstTab.get(index); 
			lstTab.remove(index);
			mesto++;
		}
	}
	
	public void izpisiSubstitucijo()
	{
		System.out.println(Arrays.toString(tabela));
		System.out.println(Arrays.toString(tabSub));
	}
	
	public void izpisiInverznoSubstitucijo()
	{
		System.out.println(Arrays.toString(tabSub)); 
		char[] tabSub2 = new char[tabSub.length];
		for(int i  = 0; i < tabela.length; i++)
		{
			int kje = kje(tabela[i]);//kje je presilkava iz neznane črke v črko tabela[i npr v A
			tabSub2[i] = tabela[kje];//na mestu tabela [kje je črka iz katere je šla v črko tabela od i
		}
		System.out.println(Arrays.toString(tabSub2));
	}
	
	public StringBuffer substitucija (StringBuffer sb)
	{
		StringBuffer sb2 = new StringBuffer();
		for(int i=0; i<sb.length(); i++)
		{
			char c = sb.charAt(i);
			int kje = kje(c);
			if(kje == -1)
			{
				sb2.append(c);
			}
			else
			{
				char zamenjava = tabela[kje];
				sb2.append(zamenjava);
			}
		}
		
		return sb2;
	}
	
	private int kje(char c)
	{
		int kje = -1;
		for(int i = 0; i < tabSub.length; i++)
		{
			if(tabSub[i] == c)
				return i;
		}
		return kje;
	}
	
	public void genSubstitucijoEnegaPara()
	{
		
		tabSub = new char[tabela.length];
		
		for(int i = 0; i < tabela.length; i++)
		{
			tabSub[i] = tabela[i];
		}
		
		//Izberemo en naključen index!
		int katero  = (int)Math.floor(tabela.length*Math.random());
		int skaterim = katero;
		while(katero == skaterim)
		{
			skaterim = (int)Math.floor(tabela.length*Math.random());
		}
		char temp = tabSub[katero];
		tabSub[katero] = tabela[skaterim];
		tabSub[skaterim] = temp;
		System.out.println("Zamenjava črk " + tabela[katero] + " => "  + tabela[skaterim]);
	
		
		
		System.out.println(Arrays.toString(tabela));
		System.out.println(Arrays.toString(tabSub));
	}
	

	public char substitute(char c)
	{
		if(Character.isLetter(c))
		{
			char velikiChar = Character.toUpperCase(c);
			
			char subC = c;
			
			if(velikiChar == 'Č')
				subC = tabSub[26];
			else if(velikiChar == 'Š')
				subC = tabSub[27];
			else if(velikiChar == 'Ž')
				subC = tabSub[28];
			else 
			{
				int index = velikiChar - (int)'A';
				if(index >= 0 && index <= 25)
				{
					subC = tabSub[index];
				}
			}
			return subC;
		} else if(c == ' ')
		{
			return tabSub[29];
		}
		else
			return c;
	}
	
	public static int getIndex(char c)
	{
		char velikiChar = Character.toUpperCase(c);
		if(velikiChar == 'Č')
			return 26;
		else if(velikiChar == 'Š')
			return 27;
		else if(velikiChar == 'Ž')
			return 28;
		else if(velikiChar == ' ')
			return 29;
		else		
			return velikiChar - (int)'A';
	}
	
	
	
	
	public void reset()
	{
		tabSub = new char[tabela.length];
		int i =0;
		for(char t : tabela)
		{
			tabSub[i] = t;
			i++;
		}
	}
	
	public void narediZamenjavo(int idxWhat, int idxWith)
	{
		if(idxWhat == idxWith)
			return;
		//normalizira indexe, ker je v matriki parov v stolpcu 0 *, v substituciji je pa v stolpcu 0 A.
		idxWhat--;
		idxWith--;
		
		//NA idxWhat postavimo idxWith
		//Kar je ekvivaletno permutacijo idxWith --> idxWhat in idxWhat --> idxWith
		
		//1. si zapomnemo, katero permutacijo bo prepisal!
		//2. zapiše permutacijo
		//3. zapiše še permutacijo, ki  si jo zapomne
		
		
		//Ketera črko predstavlja idxWhat in idxWith?
		char what = tabela[idxWhat]; //Slovar pravi ta je idxWith preslika v karakter iz slovarja
		char biloPrej = tabSub[idxWhat];
		tabSub[idxWhat] = tabSub[idxWith];
		tabSub[idxWith] = biloPrej;
		

	}
	
	
	
	public StringBuffer naključnaSubstitucija (StringBuffer sb)
	{
		genSubstitucijo();
		
		StringBuffer sb2 = new StringBuffer();
		for(int i=0; i<sb.length(); i++)
		{
			sb2.append(substitute(sb.charAt(i)));
		}
		
		return sb2;
	}
	
	
	public StringBuffer naključnaSubstitucijaEnegaPara (StringBuffer sb)
	{
		//Zamenjamo samo eno črko
		genSubstitucijoEnegaPara();
		
		StringBuffer sb2 = new StringBuffer();
		for(int i=0; i<sb.length(); i++)
		{
			sb2.append(substitute(sb.charAt(i)));
		}
		
		return sb2;
	}
	
	public static void main(String[] args) throws FileNotFoundException
	{
		StringBuffer file = Buffer.file2Buffer(new File("Test01.txt"));
		Substitucija sub = new Substitucija();
		System.out.println(sub.naključnaSubstitucijaEnegaPara(file));
	}

	public int razlikaInvert(Substitucija subZaPremešanoBesedila)
	{
		int stRazlicnih = 0;
		for(int i = 0; i < tabela.length; i++)
		{
			if(substitute(subZaPremešanoBesedila.substitute(tabela[i])) != tabela[i])
				stRazlicnih++;
		}
		return stRazlicnih;
	}
}










